#!/bin/bash
BASE_DIR=`cd $(dirname $0);pwd`

#一个官方的参考地址：https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/#example-kubeconfig-file
#这是创建kubectl使用User Account连接kubernetes APIServer的脚本
#测试版本 Kubernetes v1.25
#1. 确认服务器是有有openssl命令,没有就安装
#2. 确定kubernetes集群的CA证书以及密钥路径,修改CA_PATH和CA_KEY_PATH
#3. 确定要连接的kubernetes集群的访问地址,修改CLUSTER_ACCESS_ADDRESS
#4. 修改CLUSTER_NAME,这个name就是给kubeconfig文件中cluster配置起一个名字
#5. 修改EXPIRED_DATES,指定证书也就是用户的有效期,360就是360天后到期,根据需求修改
CA_PATH=/etc/kubernetes/pki/ca.crt
CA_KEY_PATH=/etc/kubernetes/pki/ca.key
CLUSTER_ACCESS_ADDRESS="192.168.5.39:6443"
CLUSTER_NAME=dev
EXPIRED_DATES=360

fouction_create_csr(){
	read -p "请输入要创建的用户名:" USER

	FILES_DIR=${BASE_DIR}/UserAccount/${USER}

	mkdir -p ${FILES_DIR}

	openssl genrsa -out ${FILES_DIR}/${USER}.key 2048 &>/dev/null

        #使用私钥创建一个证书签名请求文件${USER}.csr,-subj参数中指定用户名和组(CN表示用户名，O表示组)
	openssl req -new -key ${FILES_DIR}/${USER}.key -out ${FILES_DIR}/${USER}.csr -subj "/CN=${USER}/O=${USER}"
}

fouction_signature(){

	#生成最终的证书文件,证书的有效期为500天
	openssl x509 -req \
	-in ${FILES_DIR}/${USER}.csr \
	-CA ${CA_PATH} \
	-CAkey ${CA_KEY_PATH} \
	-CAcreateserial -out ${FILES_DIR}/${USER}.crt \
	-days ${EXPIRED_DATES}
        
	echo "------>证书文件位置: ${BASE_DIR}/UserAccount/${USER}"
}

fouction_config_context(){
        #配置集群信息
	kubectl config set-cluster ${CLUSTER_NAME} \
	--certificate-authority=${CA_PATH} \
	--embed-certs \
	--server=https://${CLUSTER_ACCESS_ADDRESS} \
	--kubeconfig=${FILES_DIR}/${USER}.kubeconfig

	#创建用户
	kubectl config set-credentials ${USER} \
	--client-certificate=${FILES_DIR}/${USER}.crt \
	--client-key=${FILES_DIR}/${USER}.key \
	--embed-certs \
	--kubeconfig=${FILES_DIR}/${USER}.kubeconfig

	#创建上下文
	kubectl config set-context ${USER}@${CLUSTER_NAME} \
	--cluster=${CLUSTER_NAME} \
	--user=${USER} \
	--kubeconfig=${FILES_DIR}/${USER}.kubeconfig

	#设置当前使用的上下文
	kubectl config use-context ${USER}@${CLUSTER_NAME} \
	--kubeconfig=${FILES_DIR}/${USER}.kubeconfig

	#--embed-certs 各种证书参数引用的证书文件将以 base64 形式存储在 kubeconfig 文件中,而非引用证书路径
	echo "------>各类证书已经用BASE64加密写进${FILES_DIR}/${USER}.kubeconfig文件中,可以直接使用该文件连接集群"
	echo "------>配置集群连接:
	如果已经配置了集群连接,查看是否有KUBECONFIG变量,如果有,找出定义该变量的配置文件,一般为/etc/profile或者${HOME}/.bashrc
	把新生成的连接kubernetes集群的配置文件路径配置到定义KUBECONFIG变量的文件中,例如:
	export KUBECONFIG=\${KUBECONFIG}:新配置文件路径
	source ${HOME}/.bashrc 或者 source /etc/profile
	
	如果发现没有KUBECONFIG变量,那就是使用了一个$HOME/.kube/config配置文件,把该配置文件和新配置文件一起配置到定义KUBECONFIG变量的文件中,例如:
	export KUBECONFIG=\${HOME}/.kube/config:新配置文件路径
	source ${HOME}/.bashrc 或者 source /etc/profile

	如果只是临时使用,可以使用kubectl --kubeconfig=config-demo 指定连接集群的用户配置文件,例如:
	kubectl --kubeconfig=config-demo view
	"
}

fouction_create_csr
fouction_signature
fouction_config_context
